import { observe } from "./observe/index";

export function initState(vm) {
  const options = vm.$options;

  if (vm.$options.data) {
    initData(vm);
  }
}

function proxy(vm, source, key) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[source][key];
    },
    set(newValue) {
      vm[source][key] = newValue;
    }
  })
}

function initData(vm) {
  let data = vm.$options.data;

  // 用户的 data 可能是函数和对象
  data = vm._data = typeof data === "function" ? data.call(vm) : data || {};

  // 为了方便用户通过实例 vm.xxx 直接获取到属性，而不是 vm._data.xxx 
  for (const key in data) {
    proxy(vm, "_data", key);
  }

  // defineProperty 来对属性劫持
  observe(data);

}